#ifndef PLAYER_H
#define PLAYER_H

#include "cards.h"
#include <QObject>



class Player : public QObject
{
    Q_OBJECT
public:
    enum Role { Lord, Farmer}; // 角色
    enum Sex { Man, Woman }; // 性别
    enum Type { Robot, User, Unknow }; // 玩家的类型
    enum Direction { Left, Right }; // 玩家头像的显示方向

    // Plyer类的构造
    explicit Player(QObject *parent = nullptr);
    explicit Player(QString name, QObject *parent = nullptr);


    // 设置玩家的昵称
    void setName(QString name);
    // 获取玩家的昵称
    QString getName() const;


    // 设置角色
    void setRole(Role role);
    // 获取角色
    Role getRole() const;


    // 设置玩家性别
    void setSex(Sex sex);
    // 获取玩家性别
    Sex getSex() const;


    // 设置玩家头像的方位
    void setDirection(Direction sex);
    // 获取玩家头像的方位
    Direction getDirection() const;


    // 设置玩家的类型
    void setType(Type type);
    // 获取玩家的类型
    Type getType() const;


    // 设置玩家的分数
    void setScore(int score);
    // 获取玩家的分数
    int getScore() const;


    // 设置玩家的输赢结果
    void setWin(bool flag);
    // 判断玩家的输赢
    bool isWin() const;


    // 设置当前对象的上家
    void setPrePlayer(Player* player);
    // 设置当前对象的下家
    void setNextPlayer(Player* player);
    // 获取当前对象的上家
    Player* getPrePlayer();
    // 获取当前对象的下家
    Player* getNextPlayer();


    // 叫地主 / 抢地主
    void grabLordBet(int point);


    // 存储扑克牌(发牌的时候得到的)
    void storeDispatchCard(const Card& card);
    void storeDispatchCards(const Cards& cards);


    // 得到所有的牌
    Cards getCards() const;
    // 清空玩家手中的所有牌
    void clearCards();
    // 出牌
    void playHand(const Cards& cards);


    // 设置出牌的玩家已经待处理的扑克牌
    void setPendingInfo(Player* player, const Cards& cards);
    // 获取当前出牌的顽疾
    Player* getPendPlayer() const;
    // 获取当前所出的扑克牌
    Cards getPendCards() const;

    // 存储出牌玩家对象和打出去的牌
    void storePendingInfo(Player* player, const Cards& cards);


    // 虚函数
    // 准备叫地主
    virtual void prepareCallLord();
    // 准备出牌
    virtual void preparePlayHand();
    // 考虑叫地主
    virtual void thinkCallLord();
    // 考虑出牌
    virtual void thinkPlayHand();


signals:
    void notifyGrabLordBet(Player* player, int bet);            // 通知已经叫地主下注
    void notifyPlayHand(Player* player, const Cards& cards);    // 通知已经出牌
    void notifyPickCards(Player* player, const Cards& cards);   // 通知已经发牌了（在抢地主结束的最后阶段需要通知主窗口将预留的3张
                                                                //                牌加入成为地主玩家的手牌中）

protected:
    QString m_name;         // 玩家的昵称
    Role m_role;            // 玩家在游戏中的角色
    Sex m_sex;              // 玩家的性别
    Direction m_direction;  // 玩家头像的显示方向
    Type m_type;            // 玩家的类型
    int m_score = 0;            // 玩家的分数
    bool m_isWin = false;           // 判断玩家的输赢
    Player* m_pre = nullptr;          // 前一个出牌的玩家
    Player* m_next = nullptr;         // 后一个出牌的玩家
    Cards m_cards;          // 存储多张扑克牌(玩家手中的牌)
    Cards m_pendCards;      // 存储所出的牌
    Player* m_pendPlayer = nullptr;   // 指向出牌的玩家

};

#endif // PLAYER_H
